import { MFactory } from "../core/factory";

/**
 * 已经被使用的内置事件
 */
const EVENT = {
    /**
     * 全局事件：打开相册框
     */
    ALBUM: "album"
};

const factory = new MFactory();

/**
 * 注册事件
 *
 * @param name {String} 事件名称
 * @param listener {function} 事件侦听
 */
const registry = (name, ele)=>{
    factory.push(name, ele);
};

/**
 * 解除事件侦听
 * @param name {String} 事件名称
 * @param listener {function| undefined} 事件侦听
 */
const unregister = (name)=>{
    return factory.pop(name);
};

/**
 * 清除所有事件侦听
 *
 * 前端一般不需要移除事件，事件一般在打开的时候增加侦听事件，
 * 如果未关闭界面，被强行删除，界面不会自动重新注册，需要等刷新后才能恢复。
 *
 * @param name {String} 事件名称
 */
const remove = (name)=>{
    factory.remove(name)
};

/**
 * 注册事件
 * @param name {String} 事件名称
 * @param args {any}     消息对象
 */
const post = (name, args) => {
    // 避免重复注册事件
    let list = factory.get(name);
    if (list !== undefined) {
        for (let j = 0; j < list.length; j++) {
            // 不要 try...catch... 一个地方出错，终止后续所有事件，
            // 代码上，并不觉得一个地方报错，其他地方还能正常
            list[j](args);
        }
    }
};

/**
 * 打开相册
 *
 * @param url{[string]|string}    图片地址列表
 * @param index{number}     展开的图片序号
 */
const openAlbum = (url, index = 0) => {
    if (typeof url === 'string') {
        post(EVENT.ALBUM, { urls: [url], index: index });
    } else {
        post(EVENT.ALBUM, { urls: url, index: index });
    }
};

/**
 * 注册相册
 * @param fun {function} 相册调用事件
 */
const registryAlbum = (fun) => {
    registry(EVENT.ALBUM, fun);
};

/**
 * 解除注册相册
 * @param fun {function} 相册调用事件
 */
const unregisterAlbum = (fun) => {
    unregister(EVENT.ALBUM, fun);
};

/**
 * 数据总线
 */
const EventBus = {
    EVENT,
    // registry
    remove,
    registry,
    unregister,
    // send-event
    post,
    // album
    openAlbum,
    registryAlbum,
    unregisterAlbum
};

export default EventBus;